首页 > 试题广场 >

滑动窗口的最大值

[编程题]滑动窗口的最大值
  • 热度指数:581493 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

窗口大于数组长度或窗口长度为0的时候,返回空。

数据范围: ,数组中每个元素的值满足 
要求:空间复杂度 ,时间复杂度


示例1

输入

[2,3,4,2,6,2,5,1],3

输出

[4,4,6,6,6,5]
示例2

输入

[9,10,9,-7,-3,8,2,-6],5

输出

[10,10,9,8]
示例3

输入

[1,2,3,4],5

输出

[]
推荐
import java.util.*;
/**
用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次
1.判断当前最大值是否过期
2.新增加的值从队尾开始比较,把所有比他小的值丢掉
*/
public class Solution {
   public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> res = new ArrayList<>();
       	if(size == 0) return res;
		int begin;	
		ArrayDeque<Integer> q = new ArrayDeque<>();
		for(int i = 0; i < num.length; i++){
			begin = i - size + 1;
			if(q.isEmpty())
				q.add(i);
			else if(begin > q.peekFirst())
                q.pollFirst();
		
			while((!q.isEmpty()) && num[q.peekLast()] <= num[i])
                q.pollLast();
			q.add(i);	
			if(begin >= 0)
				res.add(num[q.peekFirst()]);
		}
		return res;
    }
}

编辑于 2015-09-02 14:11:26 回复(51)
function maxInWindows(numsize) {
  const len = num.length - size
  return len < 0 || size === 0 ? [] : num.slice(0len + 1).map((_i=> Math.max(...num.slice(ii + size)));
}
发表于 2022-09-22 00:57:36 回复(0)
// 简单做法
     let arr = []
     let numlen = num.length
      if(size===0) {
        return arr
    }
    for (let i =0;i<=numlen-size;i++){
        let b = num.slice(i,i+size)
        arr.push(b.sort((a,b)=>a-b).pop())
    }
    return arr
发表于 2022-09-17 22:08:51 回复(0)
function maxInWindows(num, size)
{
    if(num.length<size||size===0) return []
    
    //第一个最大的
    let max=Math.max(...num.slice(0,size))
    let maxlist=[max]
    for(let i=size;i<num.length;i++){ 
        //大于最大值就记录
        if(num[i]>max){
            max=num[i] 
        }
        //左边界是最大就重新计算最大值
        else if(max==num[i-size]) max=Math.max(...num.slice(i-size+1,i+1))
        maxlist.push(max)
    }
    return maxlist
}


发表于 2022-03-23 12:05:33 回复(1)
暴力遍历...
function maxInWindows(num, size)
{
    // write code here
    if (size === 0) return []
    let result = [];
    for (let i=0; i<num.length-size+1; i++){
        let temp = [];
        temp = num.slice(i,i+size)
        result.push(Math.max(...temp))
    }
    return result;
}
发表于 2021-12-07 20:12:57 回复(1)